package comi.gsi.view;

import java.io.IOException;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

import comi.gsi.MyCalendar;
import comi.gsi.R;
import comi.gsi.config.UtilXml;
import comi.gsi.messaggi.I18NManager;

public abstract class MyBaseActivity extends Activity implements IFrame {

	public String PATH_DIR_FILE = "/data/data/com.gs/files/";
	MyCalendar calendar = new MyCalendar();

	@Override
	protected void onCreate(final Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if (getIdLayout() != 0) {
			setContentView(getIdLayout());
		}
		try {
			myOnCreate(savedInstanceState);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public Editor getFileXmlForConfig(final String nomeFile) {
		SharedPreferences userDefault = this.getSharedPreferences(nomeFile, MODE_PRIVATE);
		return userDefault.edit();
	}

	/**
	 * @return Deve ritornare la costante nella classe R che rappresenta il layout dell'activity. Se l'activity
	 * non ha una vista lasciare il return a 0
	 */
	protected abstract int getIdLayout();

	/**
	 * Quessto è il metodo in cui vanno implementate le funzioni dell'applicazione al posto di fare l'override
	 * del metodo onCreate
	 * 
	 * @param savedInstanceState
	 * @throws Exception 
	 */
	protected abstract void myOnCreate(final Bundle savedInstanceState) throws Exception;

	/**
	 * Se necessario fa l'inflating della vista dall'xml
	 * 
	 * @param view
	 * @param idView
	 * @return
	 */
	public View lazyLoad(View view, final int idView) {
		if (view == null) {
			view = findViewById(idView);
		}
		return view;
	}

	public EditText editLazyLoad(final View view, final int idView) {
		return (EditText) lazyLoad(view, idView);
	}

	public Spinner spinnerLazyLoad(final View view, final int idView) {
		return (Spinner) lazyLoad(view, idView);
	}

	public void ScriviXml(final String pathFile) {

	}


	public void setValueFromXMLAttribute(final String path, final String element, final String attribute, final String value) throws Exception {
		Node nodo = UtilXml.getNodo(element, path);
		Element elementNodo = UtilXml.getElement(nodo);
		elementNodo.setAttribute(attribute, value);
	}

	public String getValueFromXMLAttribute(final String path, final String element, final String attribute) throws Exception {
		Node nodo = UtilXml.getNodo(element, path);
		Element elementNodo = UtilXml.getElement(nodo);
		return elementNodo.getAttribute(attribute);
	}

	public String getValueFromImmutabileXMLAttribute(final String element, final String attribute) {
		final XmlResourceParser parser = getResources().getXml(R.xml.configcore);
		int eventType;
		try {
			eventType = parser.getEventType();
			while (eventType != XmlResourceParser.END_DOCUMENT) {

				final String tagName = parser.getName();

				if ((element).equals(tagName)) {
					return parser.getAttributeValue(null, attribute);
				}

				parser.next();
			}
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}

	@Override
	public String getLanguage() {
		try {
			//return getValueFromXMLAttribute(PATH_DIR_FILE + CoreXMLManager.XMLCOREPATH, "lang", "locale");
		} catch (Exception e) {
			e.printStackTrace();
		}
		//		setValueFromXMLAttribute(PATH_DIR_FILE + CoreXMLManager.XMLCOREPATH, "lang", "locale", "it");
		return "it";
	}

	/**
	 * Metodo facade per accedere ad un messaggio tramite la sua chiave
	 * @param key
	 * @return il messaggio
	 */
	public String getMessaggio(final String key) {
		return I18NManager.getSingleton().getMessaggio(key, this);
	}

	/**
	 * Metodo facade per accedere ad un messaggio tramite chiave e parametri interni
	 * 
	 * @param key
	 * @param params
	 * @return il messaggio
	 */
	public String getMessaggio(final String key, final String[] params) {
		return I18NManager.getSingleton().getMessaggio(key, params, this);
	}

	public void myRemoveView(final View[] views) {
		for (View view : views) {
			((ViewGroup) view.getParent()).removeView(view);
		}
	}

	/**
	 * verifica se una textview esiste ed è valorizzata
	 * @param view
	 * @return true se sono verificate tutte le condizioni
	 */
	public boolean esisteAndValorizzato(final TextView view) {
		return view != null && view.getText() != null;
	}

	/**
	 * verifica se una textview esiste
	 * @param view
	 * @return true se sono verificate tutte le condizioni
	 */
	public boolean esiste(final TextView view) {
		return view != null;
	}

	public int getYear() {
		return calendar.mYear;
	}

	public int getMonth() {
		return calendar.mMonth;
	}

	public int getDay() {
		return calendar.mDay;
	}

	public void setYear(final int year) {
		calendar.mYear = year;
	}

	public void setMonth(final int month) {
		calendar.mMonth = month;
	}

	public void setDay(final int day) {
		calendar.mDay = day;
	}

}
